/**
 * 
 */
package com.tomagency.cyberlab.server.request;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;

import com.google.inject.Inject;
import com.google.web.bindery.requestfactory.shared.*;
import com.tomagency.cyberlab.server.config.ConfigProviderFactory;
import com.tomagency.cyberlab.server.util.LoggingUtil;


import de.gammadata.business.modelle.BelegDO;
import de.gammadata.communication.modelle.PostingDO;
import de.gammadata.gwt.modelle.ResultObject;
import de.gammadata.gwt.modelle.ResultObjectImpl;
import de.gammadata.gwt.modelle.Message.Importance;
import de.gammadata.gwt.modelle.Message.Status;
import de.gammadata.persistence.BelegDAO;
import de.gammadata.persistence.PersistenceManager;
import de.gammadata.persistence.GenericDAO.SEARCHTYPE;
import de.gammadata.server.requestfactory.PersistenceLocator;

/**
 * @author gfr
 *
 */
public class BelegRequestServiceImpl implements BelegRequestService{
	
	@Inject private LoggingUtil loggingUtil;
	@Inject private BelegDAO dao;

	public Long countAllBelege() {
		EntityManager em=getEntityManager();
		long count=dao.countEntities(em);
		return count;
	}

	public List<BelegDO> findAllBelege(int start,int limit) {
		EntityManager em=getEntityManager();
		List<BelegDO>liste=dao.findAll(start, limit, em);
		loggingUtil.getLogger(this.getClass()).debug("BelegServiceImpl findAllBelege() Liste mit "+liste.size()+" Einträgen gefunden");
		return liste;
	}
	
	public List<BelegDO> findByMatchString(String suchTxt) {
		EntityManager em=getEntityManager();
		List<BelegDO>liste=dao.findByMatchString(suchTxt,SEARCHTYPE.CONTAINS,0, 300, em);
		loggingUtil.getLogger(this.getClass()).debug("BelegServiceImpl findByMatchString("+suchTxt+") Liste mit "+liste.size()+" Einträgen gefunden");
		return liste;
	}
	
	public BelegDO findBeleg(Integer id){
		EntityManager em=getEntityManager();
		BelegDO result=dao.findById(id, em);
		return result;
	}
	
	public BelegDO setBelegStatusNeu(Integer belegId, String status) {
		
			
		ResultObject result = new ResultObjectImpl();
		result.setOk(false);
		result.setMessage("Fehler bei setBelegStatus id:"+belegId+", Status: "+status);
		
		
		EntityManager em = getEntityManager();		
		BelegDO beleg=null;
//		try {
//			beleg = dao.findById(belegId, em);
//		} catch (Exception e) {
//			loggingUtil.getLogger(this.getClass()).error("setBelegStatus() Fehler bei findById()", e);
//		}
//		if (beleg==null){
//			result.setOk(false);
//			result.setMessage("Fehler Beleg nicht gefunden ID: "+belegId);
//			loggingUtil.getLogger(this.getClass()).error("setBelegStatus() Fehler bei findById() ID: "+belegId);
//			return beleg;
//		}
		
//		String xml=bubuHandler.genBubuXmlString(beleg, true, beleg.getNummer(), beleg.getNummer());
//		loggingUtil.getLogger(this.getClass()).info("placeBuBuOrder xml erzeugt: \n"+xml);
//		result.setOk(true);
//		result.setMessage("xml-string erzeugt");
		
		EntityTransaction tx=null;
		try 
		{
			tx=em.getTransaction();
			beleg = dao.findById(belegId, em);
			tx.begin();
			if (beleg==null){
				result.setOk(false);
				result.setMessage("Fehler Beleg nicht gefunden ID: "+belegId);
				loggingUtil.getLogger(this.getClass()).error("setBelegStatus() Fehler bei findById() ID: "+belegId);
				return beleg;
			}
			
			beleg.setStatus(status);
			PostingDO posting = new PostingDO();
			posting.setDate(new Date());
			posting.setImportance(Importance.NORMAL);
			posting.setSubject(beleg.getNummer()+ " "+" neuer Status = "+status);
			posting.setStatus(Status.NEU);
			posting.setProjekt(beleg.getProject());
			beleg.getMessageListe().add(0, posting); //wegen der Sortierung neueste zuerst
//			beleg.addMessage(posting);

			try {
				beleg=dao.storeEntity(beleg, em);
				tx.commit();
				result.setOk(true);
				result.setMessage(beleg.getNummer()+ " "+" neuer Status = "+status);
			} catch (Exception es) {
				tx.rollback();
				result.setOk(false);
				loggingUtil.getLogger(this.getClass()).error("setBelegStatus() Fehler beim Speichern Beleg Status", es);
				result.setMessage(beleg.getNummer()+ " "+" neuer Status = "+status+", aber Fehler beim Speichern Beleg Status: "+es.getMessage());
			}
			
				
		}
		catch (Exception e) {
			if (tx!=null)
				tx.rollback();
			loggingUtil.getLogger(this.getClass()).error("setBelegStatus() Fehler beim Speichern Beleg Status", e);
			result.setOk(false);
			result.setMessage("setBelegStatus() Fehler beim Speichern Beleg Status: "+e.getMessage());
		}
		beleg = dao.findById(belegId, em);
		loggingUtil.getLogger(this.getClass()).info("setBelegStatus() ok: "+result.isOk()+", "+result.getMessage());
		return beleg;
	}
	
	public BelegDO findBelegExt(Integer id){
		return findBeleg(id);
	}

	public EntityManager getEntityManager(){
		return PersistenceLocator.getEntityManager();
		
	}

}
